package com.cencat.order.service;

import com.cencat.order.domain.RouteInvoice;
import com.cencat.order.domain.RouteInvoiceDetail;
import com.cencat.order.domain.RouteInvoiceTemplate;
import com.cencat.order.domain.vo.RouteInvoiceVO;
import com.cencat.order.domain.vo.RouteInvoiceStatisticsVO;
import com.cencat.order.domain.vo.RouteInvoiceReportVO;
import com.cencat.order.domain.dto.RouteInvoiceCreateDTO;
import com.cencat.order.domain.dto.RouteInvoiceUpdateDTO;
import com.cencat.order.domain.dto.RouteInvoiceGenerateDTO;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;

/**
 * 线路发票管理服务接口
 * 
 * @author cencat
 * @date 2024-01-20
 */
public interface IRouteInvoiceService extends IService<RouteInvoice> {

    /**
     * 查询发票列表
     * 
     * @param routeInvoice 发票查询条件
     * @return 发票列表
     */
    List<RouteInvoice> selectRouteInvoiceList(RouteInvoice routeInvoice);

    /**
     * 获取发票详情
     * 
     * @param invoiceId 发票ID
     * @return 发票详情VO
     */
    RouteInvoiceVO getRouteInvoiceDetail(Long invoiceId);

    /**
     * 新增发票
     * 
     * @param createDTO 创建发票DTO
     * @return 发票详情VO
     */
    RouteInvoiceVO createRouteInvoice(RouteInvoiceCreateDTO createDTO);

    /**
     * 修改发票
     * 
     * @param updateDTO 更新发票DTO
     * @return 是否成功
     */
    boolean updateRouteInvoice(RouteInvoiceUpdateDTO updateDTO);

    /**
     * 删除发票
     * 
     * @param invoiceIds 发票ID数组
     * @return 是否成功
     */
    boolean deleteRouteInvoiceByIds(Long[] invoiceIds);

    /**
     * 发票生成
     */
    
    /**
     * 按路线生成发票
     * 
     * @param routeId 路线ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param invoiceType 发票类型
     * @param operatorId 操作人ID
     * @return 发票ID
     */
    Long generateInvoiceByRoute(Long routeId, String startDate, String endDate, String invoiceType, Long operatorId);

    /**
     * 按商家生成发票
     * 
     * @param merchantId 商家ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param invoiceType 发票类型
     * @param operatorId 操作人ID
     * @return 发票ID
     */
    Long generateInvoiceByMerchant(Long merchantId, String startDate, String endDate, String invoiceType, Long operatorId);

    /**
     * 批量生成发票
     * 
     * @param generateDTO 批量生成DTO
     * @return 生成结果
     */
    Map<String, Object> batchGenerateInvoices(RouteInvoiceGenerateDTO generateDTO);

    /**
     * 自动生成发票
     * 
     * @param generateType 生成类型
     * @param targetDate 目标日期
     * @return 生成结果
     */
    Map<String, Object> autoGenerateInvoices(String generateType, String targetDate);

    /**
     * 重新生成发票
     * 
     * @param invoiceId 发票ID
     * @param regenerateReason 重新生成原因
     * @param operatorId 操作人ID
     * @return 新发票ID
     */
    Long regenerateInvoice(Long invoiceId, String regenerateReason, Long operatorId);

    /**
     * 发票审核
     */
    
    /**
     * 提交发票审核
     * 
     * @param invoiceId 发票ID
     * @param submitRemark 提交备注
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean submitInvoiceForReview(Long invoiceId, String submitRemark, Long operatorId);

    /**
     * 审核发票
     * 
     * @param invoiceId 发票ID
     * @param reviewResult 审核结果
     * @param reviewRemark 审核备注
     * @param reviewerId 审核人ID
     * @return 是否成功
     */
    boolean reviewInvoice(Long invoiceId, String reviewResult, String reviewRemark, Long reviewerId);

    /**
     * 批量审核发票
     * 
     * @param invoiceIds 发票ID数组
     * @param reviewResult 审核结果
     * @param reviewRemark 审核备注
     * @param reviewerId 审核人ID
     * @return 审核结果
     */
    Map<String, Object> batchReviewInvoices(Long[] invoiceIds, String reviewResult, String reviewRemark, Long reviewerId);

    /**
     * 撤回发票审核
     * 
     * @param invoiceId 发票ID
     * @param withdrawReason 撤回原因
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean withdrawInvoiceReview(Long invoiceId, String withdrawReason, Long operatorId);

    /**
     * 发票打印与预览
     */
    
    /**
     * 打印发票
     * 
     * @param invoiceId 发票ID
     * @param printType 打印类型
     * @param printerId 打印机ID
     * @return 打印任务ID
     */
    String printInvoice(Long invoiceId, String printType, String printerId);

    /**
     * 批量打印发票
     * 
     * @param invoiceIds 发票ID数组
     * @param printType 打印类型
     * @param printerId 打印机ID
     * @return 打印任务ID
     */
    String batchPrintInvoices(Long[] invoiceIds, String printType, String printerId);

    /**
     * 预览发票
     * 
     * @param invoiceId 发票ID
     * @param previewType 预览类型
     * @return 预览数据
     */
    Map<String, Object> previewInvoice(Long invoiceId, String previewType);

    /**
     * 生成发票PDF
     * 
     * @param invoiceId 发票ID
     * @param pdfType PDF类型
     * @return PDF文件路径
     */
    String generateInvoicePDF(Long invoiceId, String pdfType);

    /**
     * 发票状态跟踪
     */
    
    /**
     * 更新发票状态
     * 
     * @param invoiceId 发票ID
     * @param status 状态
     * @param statusRemark 状态备注
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean updateInvoiceStatus(Long invoiceId, String status, String statusRemark, Long operatorId);

    /**
     * 获取发票状态历史
     * 
     * @param invoiceId 发票ID
     * @return 状态历史列表
     */
    List<Map<String, Object>> getInvoiceStatusHistory(Long invoiceId);

    /**
     * 批量更新发票状态
     * 
     * @param invoiceIds 发票ID数组
     * @param status 状态
     * @param statusRemark 状态备注
     * @param operatorId 操作人ID
     * @return 更新结果
     */
    Map<String, Object> batchUpdateInvoiceStatus(Long[] invoiceIds, String status, String statusRemark, Long operatorId);

    /**
     * 发票明细管理
     */
    
    /**
     * 获取发票明细
     * 
     * @param invoiceId 发票ID
     * @return 明细列表
     */
    List<RouteInvoiceDetail> getInvoiceDetails(Long invoiceId);

    /**
     * 添加发票明细
     * 
     * @param invoiceId 发票ID
     * @param detailData 明细数据
     * @param operatorId 操作人ID
     * @return 明细ID
     */
    Long addInvoiceDetail(Long invoiceId, Map<String, Object> detailData, Long operatorId);

    /**
     * 更新发票明细
     * 
     * @param detailId 明细ID
     * @param detailData 明细数据
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean updateInvoiceDetail(Long detailId, Map<String, Object> detailData, Long operatorId);

    /**
     * 删除发票明细
     * 
     * @param detailIds 明细ID数组
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean deleteInvoiceDetails(Long[] detailIds, Long operatorId);

    /**
     * 重新计算发票金额
     * 
     * @param invoiceId 发票ID
     * @param calculateType 计算类型
     * @return 计算结果
     */
    Map<String, Object> recalculateInvoiceAmount(Long invoiceId, String calculateType);

    /**
     * 发票模板管理
     */
    
    /**
     * 获取发票模板列表
     * 
     * @param templateType 模板类型
     * @param status 状态
     * @return 模板列表
     */
    List<RouteInvoiceTemplate> getInvoiceTemplates(String templateType, String status);

    /**
     * 创建发票模板
     * 
     * @param templateName 模板名称
     * @param templateType 模板类型
     * @param templateData 模板数据
     * @param operatorId 操作人ID
     * @return 模板ID
     */
    Long createInvoiceTemplate(String templateName, String templateType, String templateData, Long operatorId);

    /**
     * 更新发票模板
     * 
     * @param templateId 模板ID
     * @param templateData 模板数据
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean updateInvoiceTemplate(Long templateId, String templateData, Long operatorId);

    /**
     * 删除发票模板
     * 
     * @param templateIds 模板ID数组
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean deleteInvoiceTemplates(Long[] templateIds, Long operatorId);

    /**
     * 应用发票模板
     * 
     * @param invoiceId 发票ID
     * @param templateId 模板ID
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean applyInvoiceTemplate(Long invoiceId, Long templateId, Long operatorId);

    /**
     * 统计分析
     */
    
    /**
     * 获取发票统计信息
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param statisticsType 统计类型
     * @param dimension 统计维度
     * @return 统计信息VO
     */
    RouteInvoiceStatisticsVO getInvoiceStatistics(String startDate, String endDate, String statisticsType, String dimension);

    /**
     * 获取发票分析报告
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param analysisType 分析类型
     * @return 分析报告VO
     */
    RouteInvoiceReportVO getInvoiceAnalysisReport(String startDate, String endDate, String analysisType);

    /**
     * 获取收入分析
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param incomeType 收入类型
     * @return 收入分析数据
     */
    Map<String, Object> getIncomeAnalysis(String startDate, String endDate, String incomeType);

    /**
     * 获取成本分析
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param costType 成本类型
     * @return 成本分析数据
     */
    Map<String, Object> getCostAnalysis(String startDate, String endDate, String costType);

    /**
     * 获取利润分析
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param profitType 利润类型
     * @return 利润分析数据
     */
    Map<String, Object> getProfitAnalysis(String startDate, String endDate, String profitType);

    /**
     * 对账管理
     */
    
    /**
     * 创建对账单
     * 
     * @param reconciliationType 对账类型
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param targetId 对账目标ID
     * @param operatorId 操作人ID
     * @return 对账单ID
     */
    Long createReconciliation(String reconciliationType, String startDate, String endDate, Long targetId, Long operatorId);

    /**
     * 执行对账
     * 
     * @param reconciliationId 对账单ID
     * @param operatorId 操作人ID
     * @return 对账结果
     */
    Map<String, Object> executeReconciliation(Long reconciliationId, Long operatorId);

    /**
     * 确认对账结果
     * 
     * @param reconciliationId 对账单ID
     * @param confirmData 确认数据
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean confirmReconciliation(Long reconciliationId, Map<String, Object> confirmData, Long operatorId);

    /**
     * 发票归档
     */
    
    /**
     * 归档发票
     * 
     * @param invoiceIds 发票ID数组
     * @param archiveType 归档类型
     * @param archiveReason 归档原因
     * @param operatorId 操作人ID
     * @return 归档结果
     */
    Map<String, Object> archiveInvoices(Long[] invoiceIds, String archiveType, String archiveReason, Long operatorId);

    /**
     * 恢复归档发票
     * 
     * @param invoiceIds 发票ID数组
     * @param restoreReason 恢复原因
     * @param operatorId 操作人ID
     * @return 恢复结果
     */
    Map<String, Object> restoreArchivedInvoices(Long[] invoiceIds, String restoreReason, Long operatorId);

    /**
     * 获取归档发票列表
     * 
     * @param archiveType 归档类型
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 归档发票列表
     */
    List<RouteInvoice> getArchivedInvoices(String archiveType, String startDate, String endDate);

    /**
     * 搜索与验证
     */
    
    /**
     * 搜索发票
     * 
     * @param searchKeyword 搜索关键词
     * @param searchType 搜索类型
     * @param searchScope 搜索范围
     * @return 搜索结果
     */
    List<RouteInvoice> searchInvoices(String searchKeyword, String searchType, String searchScope);

    /**
     * 验证发票
     * 
     * @param invoiceId 发票ID
     * @param validationType 验证类型
     * @return 验证结果
     */
    Map<String, Object> validateInvoice(Long invoiceId, String validationType);

    /**
     * 批量验证发票
     * 
     * @param invoiceIds 发票ID数组
     * @param validationType 验证类型
     * @return 验证结果
     */
    Map<String, Object> batchValidateInvoices(Long[] invoiceIds, String validationType);

    /**
     * 数据导出导入
     */
    
    /**
     * 导出发票数据
     * 
     * @param invoiceIds 发票ID数组
     * @param exportType 导出类型
     * @param exportFields 导出字段
     * @return 导出文件路径
     */
    String exportInvoiceData(Long[] invoiceIds, String exportType, String[] exportFields);

    /**
     * 导入发票数据
     * 
     * @param invoiceList 发票列表
     * @param importType 导入类型
     * @return 导入结果消息
     */
    String importInvoiceData(List<RouteInvoice> invoiceList, String importType);

    /**
     * 生成发票报表
     * 
     * @param reportType 报表类型
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param reportParams 报表参数
     * @return 报表文件路径
     */
    String generateInvoiceReport(String reportType, String startDate, String endDate, Map<String, Object> reportParams);

    /**
     * 提醒设置
     */
    
    /**
     * 设置发票提醒
     * 
     * @param remindType 提醒类型
     * @param remindRule 提醒规则
     * @param notifyUsers 通知用户
     * @param operatorId 操作人ID
     * @return 提醒ID
     */
    Long setInvoiceReminder(String remindType, Map<String, Object> remindRule, String notifyUsers, Long operatorId);

    /**
     * 获取发票提醒列表
     * 
     * @param remindType 提醒类型
     * @param status 状态
     * @return 提醒列表
     */
    List<Map<String, Object>> getInvoiceReminders(String remindType, String status);

    /**
     * 执行发票提醒
     * 
     * @param remindType 提醒类型
     * @return 执行结果
     */
    Map<String, Object> executeInvoiceReminders(String remindType);

    /**
     * 系统管理
     */
    
    /**
     * 发票系统健康检查
     * 
     * @return 健康状态
     */
    Map<String, Object> invoiceSystemHealthCheck();

    /**
     * 数据同步
     * 
     * @param syncType 同步类型
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 是否成功
     */
    boolean syncInvoiceData(String syncType, String startDate, String endDate);

    /**
     * 缓存刷新
     * 
     * @param cacheType 缓存类型
     * @return 是否成功
     */
    boolean refreshInvoiceCache(String cacheType);

    /**
     * 获取发票编号
     * 
     * @param invoiceType 发票类型
     * @param generateDate 生成日期
     * @return 发票编号
     */
    String generateInvoiceNumber(String invoiceType, String generateDate);

    /**
     * 检查发票编号唯一性
     * 
     * @param invoiceNumber 发票编号
     * @return 是否唯一
     */
    boolean checkInvoiceNumberUnique(String invoiceNumber);
}